<?php

/**
 * session
 */
class session
{
    static private $instance = null;

	private function __construct()
	{
		if (session_id())
		{
			session_unset();
			session_destroy();
		}
		ini_set('session.save_handler', 'files');
		ini_set('session.use_trans_sid', '0');

		session_cache_limiter('none');
		session_start();
		header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');
	}


	// 析构函数
	public function __destruct()
	{
		session_write_close();
	}


	// 防止克隆
	private function __clone(){}


    // 获取数据库实例
	public static function &get_instance()
	{
	    if(self::$instance==null)
	    {
	        self::$instance = new session();
	    }
	    return self::$instance;
	}

	// 获取 session id
	public function get_id()
	{
		return session_id();
	}

	// 获取 session name
	public function get_name()
	{
		return session_name();
	}

	/**
	 * 
	 * 获取session 值
	 * @param string $name 名称
	 * @param string $default 默认值
	 */
	public function get($name, $default = null)
	{
		if (isset($_SESSION[$name]))
		{
			return $_SESSION[$name];
		}
		return $default;
	}

    /**
     * 
     * 向session中赋值
     * @param string $name 名称
     * @param string $value 值
     */
	public function set($name, $value = null)
	{
		if (null === $value) {
			unset($_SESSION[$name]);
		} else {
			$_SESSION[$name] = $value;
		}
	}

    /**
     * 
     * 是否已设置指定名称的 session
     * @param string $name 名称
     */
	public function has($name)
	{
		return isset($_SESSION[$name]);
	}

    /**
     * 
     * 清除指定名称的 session
     * @param string $name 名称
     */
	public function clear($name)
	{
		$value = null;
		if (isset($_SESSION[$name])) {
			$value = $_SESSION[$name];
			unset($_SESSION[$name]);
		}
		return $value;
	}

    /**
     * 
     * 销毁 session
     */
	public function destroy()
	{
		if (isset($_COOKIE[session_name()])) {
			setcookie(session_name(), '', time()-42000, '', '/');
		}
		session_unset();
		session_destroy();
		return true;
	}

}